package cn.tedu.csmall.sentinel.study.func;

import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.net.URL;
import java.util.List;

/**
 * 完成读取flow.rules 加载到当前项目中的
 * 这些特定功能,需要实现一个接口
 */
@Slf4j
public class DataSourceInitFunc implements InitFunc {
    /**
     * 初始化的方法,将当前项目中能读取到的所有规则配置文件
     * 在init中生成,我们自定义的List对象,元素就是对应文件的类型
     * 有限流规则和熔断规则
     * @throws Exception
     */
    @Override
    public void init() throws Exception {
        //打个日志,观察当前init方法何时加载
        log.info("DataSourceInitFunc loaded");
        //读取文件路径,当前类的类加载器,直接读取resource
        Class clazz=DataSourceInitFunc.class;
        ClassLoader classLoader = clazz.getClassLoader();
        URL resource = classLoader.getResource("flow.rules");
            //从数据文件源URL对象获取文件的路径file
        String file=resource.getFile();
        log.info("读取到文件,路径path:{}",file);
        //转化json称为Rule对象,sentinel提供了一套完整的api方便我们读取和转化json文本
        ReadableDataSource<String, List<FlowRule>> flowDataSource=
                new FileRefreshableDataSource<List<FlowRule>>(
                    file,source -> JSON.parseArray(source,FlowRule.class));
        //加载到sentinel规则中
        //FlowRuleManager.register2Property(flowDataSource.getProperty());
        //sentinel提供了文件SPI/API
        //SPI(Service Provider Interface)和API(Application Programming Interface)读取方式
    }
}
